#include "fractie.h"
#include <math.h>
#include <iostream>
int i=-1;
Fractie::Fractie(double num,double numi){
	(*this).numarator=num;
	(*this).numitor=numi;
}
Fractie Fractie::operator +(Fractie& right){
	double x,y;
	x=(*this).numarator*right.numitor+(*this).numitor*right.numarator;
	y=(*this).numitor*right.numitor;
	Fractie rez(x,y);
	return rez;
}
std::ostream& operator <<(std::ostream& out,Fractie& right){
	out<<"\nNumarator= "<<right.numarator<<" Numitor= "<<right.numitor<<"\n";
} 
Fractie Fractie::operator -(Fractie& right){
	right.numarator=-right.numarator;
	double x,y;
	x=(*this).numarator*right.numitor+(*this).numitor*right.numarator;
	y=(*this).numitor*right.numitor;
	Fractie rez(x,y);
	return rez;
}
Fractie Fractie::operator *(Fractie& right){
	double x,y;
	x=(*this).numarator*right.numarator;
	y=(*this).numitor*right.numitor;
	Fractie rez(x,y);
	return rez;
}
Fractie Fractie::operator /(Fractie& right){
	double x,y;
	x=(*this).numarator*right.numitor;
	y=(*this).numitor*right.numarator;
	Fractie rez(x,y);
	return rez;	
}
int cmmdc(Fractie& x )
{
	while(x.numarator!=x.numitor)
	{
	if (x.numarator>x.numitor)
		 x.numarator=x.numarator-x.numitor;
	else
		 x.numitor=x.numitor-x.numarator;
	return x.numitor;
	}
}
/*bool simplificare(Fractie& x)
{
	Fractie s(0,0);
	int c=0;
	c=cmmdc(x);
	s.numarator=x.numarator/c;
	s.numitor=x.numitor/c;
	if((mod(s.numitor,2))==0||(mod(s.numarator,2))==0)
		return false;
	return true;
}
*/
double mod(int a,int b)
{
	int result = static_cast<int>( a / b );
	return a - static_cast<double>( result ) * b;
}
Fractie Fractie::operator ^(int n){
double x,y;
if((*this).numarator==1&&(*this).numitor==1)
	{
			x=1;
			y=1;
		 Fractie rez(x,y);
		return rez;		
	}	
if((*this).numarator==1)
	{
		x=(*this).numarator;
		y=pow((*this).numitor,n);	
		Fractie rez(x,y);
			return rez;
	}
if((*this).numitor==1)
	{
		x=pow((*this).numarator,n);
		y=(*this).numitor;
		Fractie rez(x,y);
			return rez;
	}
}
double Fractie::getNumitor()const{
	return (*this).numitor;
}
double Fractie::getNumarator()const{
	return (*this).numarator;
}
void Fractie::setNumitor(double num){
	(*this).numitor=num;
}
void Fractie::setNumarator(double numa){
	(*this).numarator=numa;
}

SirFractii::SirFractii(Fractie& fra){
	sir[++i]=fra;
}
void SirFractii::addFractie(Fractie& fra){
	sir[++i]=fra;
}
Fractie Fractie::operator =(Fractie& right){
	(*this).setNumitor(right.getNumitor());
	(*this).setNumarator(right.getNumarator());
}
std::ostream& operator <<(std::ostream& out,SirFractii& right){	
	for(int it=0;it<=i;it++)
		{
			out<<"\nNumarator= "<<right.sir[it].getNumarator();
			out<<"\nNumitor= "<<right.sir[it].getNumitor();
		}
}
void SirFractii::suma(){
	int it;	
	double x=0,y=0;
	for(it=0;it<i;it++)
		{
			x=sir[it].getNumarator()*sir[it+1].getNumitor()+sir[it].getNumitor()*sir[it+1].getNumarator();
			y=sir[it].getNumitor()*sir[it+1].getNumitor();
		}
	Fractie s(x,y);
	std::cout<<"\nSuma este= "<<s;
}
void SirFractii::subunitara(){
	int it;
	double max=0,maxx=0;
	for(it=0;it<=i;it++)
		{
			if(sir[it].getNumarator()<sir[it].getNumitor())
				{
					max=sir[it].getNumarator();
					maxx=sir[it].getNumitor();
				}		
		}	
	for(it=0;it<=i;it++)
	{	
		if(max==sir[it].getNumarator()&&maxx==sir[it].getNumitor())
			std::cout<<sir[it];	
	}
}
void SirFractii::supraunitara(){
		int it;
	double max=0,maxx=0;
	for(it=0;it<=i;it++)
		{
			if(sir[it].getNumarator()>sir[it].getNumitor())
				{
					max=sir[it].getNumarator();
					maxx=sir[it].getNumitor();
				}		
		}	
	for(it=0;it<=i;it++)
	{	
		if(max==sir[it].getNumarator()&&maxx==sir[it].getNumitor())
			std::cout<<sir[it];	
	}
}
void SirFractii::ordonare()
{ 
     int it, j;
		 Fractie aux(0,0); 
     for (it=1;it<=i;it++)
     { 
        j=it; 
        while (j>0 && sir[j-1]>sir[j])
        { 
            aux=sir[j]; 
            sir[j]=sir[j-1]; 
            sir[j-1]=aux; 
            j--; 
        } 
     } 
}  
bool Fractie::operator >(Fractie& right){
	if((*this).numitor>right.numitor&&(*this).numarator>right.numarator)
		return true;
	return false;
}
